using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._SpatialAnalystTools._Surface
{
    /// <summary>
    /// <para>Geodesic Viewshed</para>
    /// <para>Determines the raster surface locations visible to a set of observer features using geodesic methods.</para>
    /// <para>使用测地线方法确定一组观察点要素可见的栅格表面位置。</para>
    /// </summary>    
    [DisplayName("Geodesic Viewshed")]
    public class Viewshed2 : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public Viewshed2()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_raster">
        /// <para>Input raster</para>
        /// <para><xdoc>
        ///   <para>The input surface raster. It can be an integer or a floating-point raster.</para>
        ///   <para>The input raster is transformed into a 3D geocentric coordinate system during the visibility calculation. NoData cells on the input raster do not block the visibility determination.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入表面栅格。它可以是整数或浮点栅格。</para>
        ///   <para>在可见性计算期间，输入栅格将转换为 3D 地心坐标系。输入栅格上的 NoData 像元不会阻止可见性确定。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_in_observer_features">
        /// <para>Input point or polyline observer features</para>
        /// <para><xdoc>
        ///   <para>The input feature class that identifies the observer locations. It can be point, multipoint, or polyline features.</para>
        ///   <para>The input feature class is transformed into a 3D geocentric coordinate system during the visibility calculation. Observers outside of the extent of the surface raster or located on NoData cells will be ignored in the calculation.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>用于标识观察点位置的输入要素类。它可以是点要素、多点要素或折线要素。</para>
        ///   <para>在可见性计算过程中，输入要素类将转换为 3D 地心坐标系。在计算中，将忽略表面栅格范围之外或位于 NoData 像元上的观察点。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_out_raster">
        /// <para>Output raster</para>
        /// <para><xdoc>
        ///   <para>The output raster.</para>
        ///   <para>For the Frequency analysis type, when the vertical error parameter is 0 or not specified, the output raster records the number of times that each cell location in the input surface raster can be seen by the input observation points. When the vertical error parameter is greater than 0, each cell on the output raster records the sum of probabilities that the cell is visible to any of the observers. For the Observers analysis type, the output raster records the unique region IDs for the visible areas, which can be related back to the observer features through the output observer-region relationship table.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出栅格。</para>
        ///   <para>对于频率分析类型，当垂直误差参数为 0 或未指定时，输出栅格将记录输入观测点可以看到输入表面栅格中每个像元位置的次数。当垂直误差参数大于 0 时，输出栅格上的每个像元都会记录该像元对任何观察点可见的概率总和。对于观察点分析类型，输出栅格将记录可见区域的唯一区域 ID，这些 ID 可通过输出观察点-区域关系表与观察点要素相关联。</para>
        /// </xdoc></para>
        /// </param>
        public Viewshed2(object _in_raster, object _in_observer_features, object _out_raster)
        {
            this._in_raster = _in_raster;
            this._in_observer_features = _in_observer_features;
            this._out_raster = _out_raster;
        }
        public override string ToolboxName => "Spatial Analyst Tools";

        public override string ToolName => "Geodesic Viewshed";

        public override string CallName => "sa.Viewshed2";

        public override List<string> AcceptEnvironments => ["autoCommit", "cellSize", "cellSizeProjectionMethod", "compression", "configKeyword", "extent", "geographicTransformations", "mask", "outputCoordinateSystem", "parallelProcessingFactor", "scratchWorkspace", "snapRaster", "tileSize", "workspace"];

        public override object[] ParameterInfo => [_in_raster, _in_observer_features, _out_raster, _out_agl_raster, _analysis_type.GetGPValue(), _vertical_error, _out_observer_region_relationship_table, _refractivity_coefficient, _surface_offset, _observer_elevation, _observer_offset, _inner_radius, _inner_radius_is_3d.GetGPValue(), _outer_radius, _outer_radius_is_3d.GetGPValue(), _horizontal_start_angle, _horizontal_end_angle, _vertical_upper_angle, _vertical_lower_angle, _analysis_method.GetGPValue()];

        /// <summary>
        /// <para>Input raster</para>
        /// <para><xdoc>
        ///   <para>The input surface raster. It can be an integer or a floating-point raster.</para>
        ///   <para>The input raster is transformed into a 3D geocentric coordinate system during the visibility calculation. NoData cells on the input raster do not block the visibility determination.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入表面栅格。它可以是整数或浮点栅格。</para>
        ///   <para>在可见性计算期间，输入栅格将转换为 3D 地心坐标系。输入栅格上的 NoData 像元不会阻止可见性确定。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_raster { get; set; }


        /// <summary>
        /// <para>Input point or polyline observer features</para>
        /// <para><xdoc>
        ///   <para>The input feature class that identifies the observer locations. It can be point, multipoint, or polyline features.</para>
        ///   <para>The input feature class is transformed into a 3D geocentric coordinate system during the visibility calculation. Observers outside of the extent of the surface raster or located on NoData cells will be ignored in the calculation.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>用于标识观察点位置的输入要素类。它可以是点要素、多点要素或折线要素。</para>
        ///   <para>在可见性计算过程中，输入要素类将转换为 3D 地心坐标系。在计算中，将忽略表面栅格范围之外或位于 NoData 像元上的观察点。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input point or polyline observer features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_observer_features { get; set; }


        /// <summary>
        /// <para>Output raster</para>
        /// <para><xdoc>
        ///   <para>The output raster.</para>
        ///   <para>For the Frequency analysis type, when the vertical error parameter is 0 or not specified, the output raster records the number of times that each cell location in the input surface raster can be seen by the input observation points. When the vertical error parameter is greater than 0, each cell on the output raster records the sum of probabilities that the cell is visible to any of the observers. For the Observers analysis type, the output raster records the unique region IDs for the visible areas, which can be related back to the observer features through the output observer-region relationship table.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出栅格。</para>
        ///   <para>对于频率分析类型，当垂直误差参数为 0 或未指定时，输出栅格将记录输入观测点可以看到输入表面栅格中每个像元位置的次数。当垂直误差参数大于 0 时，输出栅格上的每个像元都会记录该像元对任何观察点可见的概率总和。对于观察点分析类型，输出栅格将记录可见区域的唯一区域 ID，这些 ID 可通过输出观察点-区域关系表与观察点要素相关联。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_raster { get; set; }


        /// <summary>
        /// <para>Output above ground level raster</para>
        /// <para><xdoc>
        ///   <para>The output above ground level (AGL) raster.</para>
        ///   <para>The AGL result is a raster where each cell value is the minimum height that must be added to an otherwise nonvisible cell to make it visible by at least one observer. Cells that were already visible will be assigned 0 in this output raster.</para>
        ///   <para>When the vertical error parameter is 0, the output AGL raster is a one-band raster. When vertical error is greater than 0, to account for the random effects from the input raster, the output AGL raster is created as a three-band raster. The first band represents the mean AGL values, the second band represents the minimum AGL values, and the third band represents the maximum AGL values.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出地面以上 （AGL） 栅格。</para>
        ///   <para>AGL 结果是一个栅格，其中每个像元值都是必须添加到原本不可见的像元的最小高度，才能使其至少被一个观察者看到。在此输出栅格中，已可见的像元将被指定为 0。</para>
        ///   <para>当垂直误差参数为 0 时，输出 AGL 栅格为单波段栅格。当垂直误差大于 0 时，为了考虑输入栅格的随机效应，输出 AGL 栅格将创建为三波段栅格。第一个波段表示平均 AGL 值，第二个波段表示最小 AGL 值，第三个波段表示最大 AGL 值。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output above ground level raster")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_agl_raster { get; set; } = null;


        /// <summary>
        /// <para>Analysis type</para>
        /// <para><xdoc>
        ///   <para>Specifies the type of visibility analysis you wish to perform, either determining how visible each cell is to the observers, or identifying for each surface location which observers are visible.</para>
        ///   <bulletList>
        ///     <bullet_item>Frequency—The output records the number of times that each cell location in the input surface raster can be seen by the input observation locations (as points or as vertices for polyline observer features). This is the default.</bullet_item><para/>
        ///     <bullet_item>Observers—The output identifies exactly which observer points are visible from each raster surface location. The allowed maximum number of input observers is 32 with this analysis type.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要执行的可见性分析类型，确定每个像元对观察点的可见程度，或确定每个表面位置的观察点可见。</para>
        ///   <bulletList>
        ///     <bullet_item>频率 - 输出记录输入观测点位置（作为点或折线观察点要素的折点）可查看输入表面栅格中每个像元位置的次数。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>观察点 - 输出可准确识别从每个栅格表面位置可见的观察点。对于此分析类型，允许的最大输入观察点数为 32。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Analysis type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _analysis_type_value _analysis_type { get; set; } = _analysis_type_value._FREQUENCY;

        public enum _analysis_type_value
        {
            /// <summary>
            /// <para>Frequency</para>
            /// <para>Frequency—The output records the number of times that each cell location in the input surface raster can be seen by the input observation locations (as points or as vertices for polyline observer features). This is the default.</para>
            /// <para>频率 - 输出记录输入观测点位置（作为点或折线观察点要素的折点）可查看输入表面栅格中每个像元位置的次数。这是默认设置。</para>
            /// </summary>
            [Description("Frequency")]
            [GPEnumValue("FREQUENCY")]
            _FREQUENCY,

            /// <summary>
            /// <para>Observers</para>
            /// <para>Observers—The output identifies exactly which observer points are visible from each raster surface location. The allowed maximum number of input observers is 32 with this analysis type.</para>
            /// <para>观察点 - 输出可准确识别从每个栅格表面位置可见的观察点。对于此分析类型，允许的最大输入观察点数为 32。</para>
            /// </summary>
            [Description("Observers")]
            [GPEnumValue("OBSERVERS")]
            _OBSERVERS,

        }

        /// <summary>
        /// <para>Vertical error</para>
        /// <para><xdoc>
        ///   <para>The amount of uncertainty (the Root Mean Square error, or RMSE) in the surface elevation values. It is a floating-point value representing the expected error of the input elevation values. When this parameter is assigned a value greater than 0, the output visibility raster will be floating point. In this case, each cell value on the output visibility raster represents the sum of probabilities that the cell is visible to any of the observers.</para>
        ///   <para>When the analysis type is Observers or the analysis method is Perimeter Sightlines, this parameter is disabled.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>表面高程值的不确定性（均方根误差，或 RMSE）。它是一个浮点值，表示输入高程值的预期误差。如果为此参数分配了大于 0 的值，则输出可见性栅格将为浮点型。在这种情况下，输出可见性栅格上的每个像元值表示该像元对任何观察点可见的概率之和。</para>
        ///   <para>当分析类型为观察点或分析方法为周长视线时，此参数处于禁用状态。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Vertical error")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public string _vertical_error { get; set; } = "0 Meters";


        /// <summary>
        /// <para>Output observer-region relationship table</para>
        /// <para><xdoc>
        ///   <para>The output table for identifying the regions that are visible to each observer. This table can be related to the input observer feature class and the output visibility raster for identifying the regions visible to given observers.</para>
        ///   <para>This output is only created when the analysis type is Observers.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>用于标识每个观察点可见的区域的输出表。此表可以与输入观察点要素类和输出可见性栅格相关，用于识别给定观察点可见的区域。</para>
        ///   <para>仅当分析类型为“观察者”时，才会创建此输出。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output observer-region relationship table")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_observer_region_relationship_table { get; set; } = null;


        /// <summary>
        /// <para>Refractivity coefficient</para>
        /// <para><xdoc>
        ///   <para>The coefficient of the refraction of visible light in air.</para>
        ///   <para>The default value is 0.13.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>空气中可见光的折射系数。</para>
        ///   <para>默认值为 0.13。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Refractivity coefficient")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _refractivity_coefficient { get; set; } = 0.13;


        /// <summary>
        /// <para>Surface offset</para>
        /// <para><xdoc>
        ///   <para>A vertical distance to be added to the z-value of each cell as it is considered for visibility. It must be a positive integer or floating-point value.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>If this parameter is set to a value, that value will be applied to all the observers. To specify different values for each observer, set this parameter to a field in the input observer features dataset.</para>
        ///   <para>The default value is 0.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要添加到每个单元格的 z 值的垂直距离，因为它被考虑为可见性。它必须是正整数或浮点值。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>如果此参数设置为某个值，则该值将应用于所有观察点。要为每个观察点指定不同的值，请将此参数设置为输入观察点要素数据集中的字段。</para>
        ///   <para>默认值为 0。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Surface offset")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _surface_offset { get; set; } = null;


        /// <summary>
        /// <para>Observer elevation</para>
        /// <para><xdoc>
        ///   <para>The surface elevations of the observer points or vertices.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>If this parameter is not specified, the observer elevation will be obtained from the surface raster using bilinear interpolation. If this parameter is set to a value, that value will be applied to all the observers. To specify different values for each observer, set this parameter to a field in the input observer features dataset.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>观察点或顶点的表面高程。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>如果未指定此参数，则将使用双线性插值从表面栅格获取观测点高程。如果此参数设置为某个值，则该值将应用于所有观察点。要为每个观察点指定不同的值，请将此参数设置为输入观察点要素数据集中的字段。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Observer elevation")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _observer_elevation { get; set; } = null;


        /// <summary>
        /// <para>Observer offset</para>
        /// <para><xdoc>
        ///   <para>A vertical distance to be added to the observer elevation. It must be a positive integer or floating-point value.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>If this parameter is set to a value, that value will be applied to all the observers. To specify different values for each observer, set this parameter to a field in the input observer features dataset.</para>
        ///   <para>The default value is 1 meter.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要添加到观察点高程的垂直距离。它必须是正整数或浮点值。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>如果此参数设置为某个值，则该值将应用于所有观察点。要为每个观察点指定不同的值，请将此参数设置为输入观察点要素数据集中的字段。</para>
        ///   <para>默认值为 1 meter。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Observer offset")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _observer_offset { get; set; } = null;


        /// <summary>
        /// <para>Inner radius</para>
        /// <para><xdoc>
        ///   <para>The start distance from which visibility is determined. Cells closer than this distance are not visible in the output but can still block visibility of the cells between inner radius and outer radius.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>If this parameter is set to a value, that value will be applied to all the observers. To specify different values for each observer, set this parameter to a field in the input observer features dataset.</para>
        ///   <para>The default value is 0.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>确定可见性的起始距离。小于此距离的像元在输出中不可见，但仍会阻止内半径和外半径之间的像元可见。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>如果此参数设置为某个值，则该值将应用于所有观察点。要为每个观察点指定不同的值，请将此参数设置为输入观察点要素数据集中的字段。</para>
        ///   <para>默认值为 0。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Inner radius")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _inner_radius { get; set; } = null;


        /// <summary>
        /// <para>Inner radius is 3D distance</para>
        /// <para><xdoc>
        ///   <para>Specifies the type of distance for the inner radius parameter.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—The inner radius is to be interpreted as a 2D distance. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—The inner radius is to be interpreted as a 3D distance.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定内半径参数的距离类型。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 内半径将被解释为 2D 距离。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 内半径将被解释为 3D 距离。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Inner radius is 3D distance")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _inner_radius_is_3d_value _inner_radius_is_3d { get; set; } = _inner_radius_is_3d_value._false;

        public enum _inner_radius_is_3d_value
        {
            /// <summary>
            /// <para>3D</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("3D")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>GROUND</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("GROUND")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Outer radius</para>
        /// <para><xdoc>
        ///   <para>The maximum distance from which visibility is determined. Cells beyond this distance are excluded from the analysis.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>If this parameter is set to a value, that value will be applied to all the observers. To specify different values for each observer, set this parameter to a field in the input observer features dataset.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>确定可见性的最大距离。超出此距离的细胞将被排除在分析之外。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>如果此参数设置为某个值，则该值将应用于所有观察点。要为每个观察点指定不同的值，请将此参数设置为输入观察点要素数据集中的字段。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Outer radius")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _outer_radius { get; set; } = null;


        /// <summary>
        /// <para>Outer radius is 3D distance</para>
        /// <para><xdoc>
        ///   <para>Specifies the type of distance for the outer radius parameter.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—The outer radius is to be interpreted as a 2D distance. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—The outer radius is to be interpreted as a 3D distance.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定外半径参数的距离类型。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 外半径将被解释为 2D 距离。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 外半径将解释为 3D 距离。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Outer radius is 3D distance")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _outer_radius_is_3d_value _outer_radius_is_3d { get; set; } = _outer_radius_is_3d_value._false;

        public enum _outer_radius_is_3d_value
        {
            /// <summary>
            /// <para>3D</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("3D")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>GROUND</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("GROUND")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Horizontal start angle</para>
        /// <para><xdoc>
        ///   <para>The start angle of the horizontal scan range. The value should be specified in degrees from 0 to 360, either as integer or floating point, with 0 oriented to north. The default value is 0.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>If this parameter is set to a value, that value will be applied to all the observers. To specify different values for each observer, set this parameter to a field in the input observer features dataset.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>水平扫描范围的起始角度。该值应以 0 到 360 的度数为单位指定，可以是整数或浮点数，其中 0 朝北。默认值为 0。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>如果此参数设置为某个值，则该值将应用于所有观察点。要为每个观察点指定不同的值，请将此参数设置为输入观察点要素数据集中的字段。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Horizontal start angle")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _horizontal_start_angle { get; set; } = null;


        /// <summary>
        /// <para>Horizontal end angle</para>
        /// <para><xdoc>
        ///   <para>The end angle of the horizontal scan range. The value should be specified in degrees from 0 to 360, either as integer or floating point, with 0 oriented to north. The default value is 360.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>If this parameter is set to a value, that value will be applied to all the observers. To specify different values for each observer, set this parameter to a field in the input observer features dataset.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>水平扫描范围的结束角。该值应以 0 到 360 的度数为单位指定，可以是整数或浮点数，其中 0 朝北。默认值为 360。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>如果此参数设置为某个值，则该值将应用于所有观察点。要为每个观察点指定不同的值，请将此参数设置为输入观察点要素数据集中的字段。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Horizontal end angle")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _horizontal_end_angle { get; set; } = null;


        /// <summary>
        /// <para>Vertical upper angle</para>
        /// <para><xdoc>
        ///   <para>The upper vertical angle limit of the scan relative to the horizontal plane. The value is specified in degrees and can be integer or floating point. The allowed range is from above -90 up to and including 90.</para>
        ///   <para>This parameter value must be greater than the Vertical Lower Angle parameter value.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>If this parameter is set to a value, that value will be applied to all the observers. To specify different values for each observer, set this parameter to a field in the input observer features dataset.</para>
        ///   <para>The default value is 90 (straight up).</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>扫描相对于水平面的垂直角度上限。该值以度为单位指定，可以是整数或浮点数。允许的范围是从 -90 以上到 90（包括 90）。</para>
        ///   <para>此参数值必须大于“垂直下角”参数值。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>如果此参数设置为某个值，则该值将应用于所有观察点。要为每个观察点指定不同的值，请将此参数设置为输入观察点要素数据集中的字段。</para>
        ///   <para>默认值为 90（直上）。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Vertical upper angle")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _vertical_upper_angle { get; set; } = null;


        /// <summary>
        /// <para>Vertical lower angle</para>
        /// <para><xdoc>
        ///   <para>The lower vertical angle limit of the scan relative to the horizontal plane. The value is specified in degrees and can be integer or floating point. The allowed range is from -90 up to but not including 90.</para>
        ///   <para>This parameter value must be less than the Vertical Upper Angle parameter value.</para>
        ///   <para>You can select a field in the input observers dataset, or you can specify a numerical value.</para>
        ///   <para>If this parameter is set to a value, that value will be applied to all the observers. To specify different values for each observer, set this parameter to a field in the input observer features dataset.</para>
        ///   <para>The default value is -90 (straight down).</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>扫描相对于水平面的垂直角度下限。该值以度为单位指定，可以是整数或浮点数。允许的范围是从 -90 到但不包括 90。</para>
        ///   <para>此参数值必须小于“垂直上角”参数值。</para>
        ///   <para>您可以在输入观察点数据集中选择字段，也可以指定数值。</para>
        ///   <para>如果此参数设置为某个值，则该值将应用于所有观察点。要为每个观察点指定不同的值，请将此参数设置为输入观察点要素数据集中的字段。</para>
        ///   <para>默认值为 -90（直线向下）。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Vertical lower angle")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _vertical_lower_angle { get; set; } = null;


        /// <summary>
        /// <para>Analysis method</para>
        /// <para><xdoc>
        ///   <para>Specifies the method by which the visibility will be calculated. This option allows you to trade some accuracy for increased performance.</para>
        ///   <bulletList>
        ///     <bullet_item>All Sightlines—A sightline is run to every cell on the raster in order to establish visible areas. This is the default method.</bullet_item><para/>
        ///     <bullet_item>Perimeter Sightlines—Sightlines are only run to the cells on the perimeter of the visible areas in order to establish visibility areas. This method has a better performance than the All Sightlines method since less sightlines are run in the calculation.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定计算可见性的方法。此选项允许您牺牲一些准确性来提高性能。</para>
        ///   <bulletList>
        ///     <bullet_item>所有视线 - 视线将运行到栅格上的每个像元，以建立可见区域。这是默认方法。</bullet_item><para/>
        ///     <bullet_item>周界视线 - 视线仅运行到可见区域周边的像元，以建立可见性区域。此方法比“所有视线”方法具有更好的性能，因为在计算中运行的视线较少。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Analysis method")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _analysis_method_value _analysis_method { get; set; } = _analysis_method_value._ALL_SIGHTLINES;

        public enum _analysis_method_value
        {
            /// <summary>
            /// <para>All Sightlines</para>
            /// <para>All Sightlines—A sightline is run to every cell on the raster in order to establish visible areas. This is the default method.</para>
            /// <para>所有视线 - 视线将运行到栅格上的每个像元，以建立可见区域。这是默认方法。</para>
            /// </summary>
            [Description("All Sightlines")]
            [GPEnumValue("ALL_SIGHTLINES")]
            _ALL_SIGHTLINES,

            /// <summary>
            /// <para>Perimeter Sightlines</para>
            /// <para>Perimeter Sightlines—Sightlines are only run to the cells on the perimeter of the visible areas in order to establish visibility areas. This method has a better performance than the All Sightlines method since less sightlines are run in the calculation.</para>
            /// <para>周界视线 - 视线仅运行到可见区域周边的像元，以建立可见性区域。此方法比“所有视线”方法具有更好的性能，因为在计算中运行的视线较少。</para>
            /// </summary>
            [Description("Perimeter Sightlines")]
            [GPEnumValue("PERIMETER_SIGHTLINES")]
            _PERIMETER_SIGHTLINES,

        }

        public Viewshed2 SetEnv(int? autoCommit = null, object cellSize = null, object compression = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object mask = null, object outputCoordinateSystem = null, object parallelProcessingFactor = null, object scratchWorkspace = null, object snapRaster = null, double[] tileSize = null, object workspace = null)
        {
            base.SetEnv(autoCommit: autoCommit, cellSize: cellSize, compression: compression, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, mask: mask, outputCoordinateSystem: outputCoordinateSystem, parallelProcessingFactor: parallelProcessingFactor, scratchWorkspace: scratchWorkspace, snapRaster: snapRaster, tileSize: tileSize, workspace: workspace);
            return this;
        }

    }

}